package com.hy.main.demo.io;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Objects;

/**
 * @Author yang DongYong
 * @Date 2022/4/25 - 04 - 25 - 20:28
 * @Description: com.hy.main.demo.file
 * @version: 1.0
 */
public class FileInputStreams {
    public static void main(String[] args) throws IOException {
//        String path = "e:\\fileTest.txt";
//        readFile(path);
        String path = "e:\\myFile.txt";
        fileOutPutStreams(path);
    }

    /**
     * 文件输入流
     *
     * @param filePath 文件路径
     * @throws IOException
     */
    public static void readFile(String filePath) throws IOException {
        FileInputStream fileInputStream = null;
        // 定义每次读取的字节 实际上可以做到缓冲的作用
        byte[] bytes = new byte[1024 * 1024];
        //  实际读取到的字符数量
        int len = 0;
        try {
            fileInputStream = new FileInputStream(filePath);
            while ((len = fileInputStream.read(bytes)) != -1) {
                System.out.println(new String(bytes, 0, len));
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 不关闭流 的根本原因是，文件描述符不属于jvm管理的，是没有办法通过垃圾回收器回收，因此必须手动关闭流 否则会造成电脑资源浪费
            Objects.requireNonNull(fileInputStream).close();
        }
    }

    public static void fileOutPutStreams(String path) throws IOException {
        FileOutputStream fileOutputStream = null;

        try {
            // FileOutputStream(path, true); 第二个参数为true的时候写入字符串为追加
            fileOutputStream = new FileOutputStream(path, true);
            String name = "yyyhh";
            // 使用String的方法将字符串转换为Byte数组
            fileOutputStream.write(name.getBytes(StandardCharsets.UTF_8));
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 不关闭流的根本原因是，文件描述不属于jvm管理的，没有办法通过垃圾回收，因此必须手动关闭流 否则会造成电脑内存资源浪费
            fileOutputStream.close();
        }
    }
}
